// -- Includes --

// C++
#include <cstdlib>
#include <iostream>

// Mine
#include "cpu.h"
#include "opcodes.h"

// -- Name Space --
namespace Kestrel
{
    
    // -- Structs --
    
    // -- Variables --
    
    // -- Functions --
    
    // -- Class --
    
        // Constructor
        CPU::CPU()
        {
         
            // Set variables
            CPU::SP = 0xFF;
                        
        }
        
        // Destructor
        CPU::~CPU()
        {
         
            // Do stuff
            
        }
        
        // Initialise
        void CPU::Init()
        {
         
            // Do stuff
            
        }
        
        // Execute
        void CPU::Execute()
        {
            
            // Do stuff
            
        }
        
        // Loop 
        void CPU::Loop()
        {
         
            // Do stuff
            
        }
        
        // Flags to Byte
        unsigned char CPU::FlagsToByte()
        {
         
            // Do it.
            unsigned char Byte;
                // Carry Flag
                Byte = (int) CPU::CarryFlag;
                // Zero Flag
                Byte += ((int) CPU::ZeroFlag) << 1;
                // Interrupt Disable Flag
                Byte += ((int) CPU::InterruptFlag) << 2;
                // Decimal Flag
                Byte += ((int) CPU::DecimalFlag) << 3;
                // Break Flag
                Byte += ((int) CPU::BreakFlag) << 4;
                // Overflow Flag
                Byte += ((int) CPU::OverflowFlag) << 6;
                // Negative Flag
                Byte += ((int) CPU::NegativeFlag) << 7;
            
            // Return
            return Byte;
            
        }
        
        // Flags From Byte
        void CPU::FlagsFromByte(unsigned char Byte)
        {
         
            // Do it.
                // Carry Flag
                CPU::CarryFlag = (bool) (Byte & 1);
                // Zero Flag 
                CPU::ZeroFlag = (bool) ((Byte & 2) >> 1);
                // Interrupt Disable Flag
                CPU::InterruptFlag = (bool) ((Byte & 4) >> 2);
                // Decimal Flag
                CPU::DecimalFlag = (bool) ((Byte & 8) >> 3);
                // Break Flag
                CPU::BreakFlag = (bool) ((Byte & 16) >> 4);
                // Overflow Flag
                CPU::OverflowFlag = (bool) ((Byte & 64) >> 6);
                // Negative Flag
                CPU::NegativeFlag = (bool) ((Byte & 128) >> 7);
            
        }
    
} // </Namespace>
